package com.baofu.paycore.dal.mapper;

import com.baofu.paycore.dal.model.PayDO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 支付主单Mapper
 *
 * <p>
 *  1.新增支付主单信息
 *  2.根据 payNo 查询主支付单
 *  3.查询支付单
 *  4.更新支付单
 *  5.支付订单状态查询
 *  6.更新已处理退款（预授权金额）
 *  7.校验订单是否支付过
 *  8.支付信息查询 支付单号，渠道、服务类型、处理状态、请求流水号、退款标志，手机号码
 * </p>
 * User: xin deng  Date: 16/4/20 ProjectName: paycore Version: 1.0
 */
public interface PayMapper {

    /**
     * 新增支付主单信息
     *
     * @param payDO  支付主单对象
     * @return       新增数
     */
    int insert(PayDO payDO);

    /**
     * 根据 payNo 查询主支付单
     *
     * @param payNo 主支付单号
     * @return 主支付对象
     */
    PayDO selectByPayNo(@Param("payNo") String payNo);


    /**
     * 查询支付单
     *
     * @param payNo        支付单号
     * @param requestBizNo 请求业务编号
     * @param requestDate  请求日期
     * @return 支付主单对象
     */
    PayDO selectByOrderInfo(@Param("payNo") String payNo,
                            @Param("requestBizNo") String requestBizNo,
                            @Param("requestDate") Date requestDate,
                            @Param("requestSystem") String requestSystem);

    /**
     * 更新支付单
     *
     * @param payNo 支付单号
     * @return 支付主单对象
     */
    int updateStatusByPayNo(@Param("payNo") String payNo,
                            @Param("status") String status);

    /**
     * 支付订单状态查询
     * @param requestSystem     请求系统
     * @param requestBizNo      请求业务编号
     * @param payNo             支付订单号
     * @param ccy               货币
     * @param amt               金额
     * @return                  主单对象
     */
    List<PayDO> selectOrderStatus(@Param("requestSystem")String requestSystem,
                                  @Param("requestBizNo")String requestBizNo,
                                  @Param("payNo")String payNo,
                                  @Param("ccy")String ccy,
                                  @Param("amt")Long amt);

    /**
     * 更新已处理退款（预授权金额）
     *
     * @param payNo        主单号
     * @param refundAmt    累计处理金额
     * @param updatedBy    更新人
     * @return             更新记录数
     */
    int updateRefundAmt(@Param("payNo")      String payNo,
                        @Param("refundAmt")  Long refundAmt,
                        @Param("updatedBy")  String updatedBy);

    /**
     * 校验订单是否支付过
     * @param requestSystem     请求系统
     * @param requestBizNo      请求业务编号
     * @param requestUser       请求操作员
     * @param amt               交易金额
     * @return                  主单
     */
    List<PayDO> validateOrderPayAgain(@Param("requestSystem") String requestSystem,
                                      @Param("requestBizNo") String requestBizNo,
                                      @Param("requestUser") String requestUser,
                                      @Param("amt") Long amt);

    /**
     * 分页查询支付信息
     *
     * @param payDO         请求参数
     * @param beginPage     开始行
     * @param endPage       结束行
     * @return              支付信息
     */
    List<PayDO> query(@Param("bean") PayDO payDO, @Param("startDate") Date startDate, @Param("endDate") Date endDate, @Param("beginPage") Integer beginPage,
                      @Param("endPage") Integer endPage);

    /**
     * 查询支付信息总数
     *
     * @param payDO         请求参数
     * @return              总数
     */
    int queryPageCount(@Param("bean") PayDO payDO, @Param("startDate") Date startDate, @Param("endDate") Date endDate);


    /**
     * 根据订单号查询
     *
     * @param orderNo         订单号
     * @param requestBizNo    支付流水号
     * @param requestDate     请求日期
     * @return                支付对象
     */
    PayDO selectByOrderNo(@Param("requestOrderNo") String orderNo,
                          @Param("requestBizNo") String requestBizNo,
                          @Param("requestDate") Date requestDate,
                          @Param("requestSystem") String requestSystem);

    /**
     * 根据支付单号查询锁定支付主单信息
     *
     * @param requestOrderNo   请求订单号
     * @param requestBizNo     请求流水号
     * @return                 支付信息
     */
    PayDO selectByPayNoForUpdate(@Param("requestOrderNo")  String requestOrderNo,
                                 @Param("requestBizNo")    String requestBizNo,
                                 @Param("requestSystem") String requestSystem);


    /**
     * 更新已处理退款（预授权金额）
     *
     * @param payNo        主单号
     * @param refundAmt    累计处理金额
     * @param updatedBy    更新人
     * @return             更新记录数
     */
    int updateRefundAmtByFallback(@Param("payNo")      String payNo,
                                  @Param("refundAmt")  Long refundAmt,
                                  @Param("updatedBy")  String updatedBy);
}
